import {IView} from '../types/IView';
import {IAttr} from '../types/IAttr';

export interface IViewObject<V extends IView> {
  readonly viewType: string;

  readonly attrs: IAttr[];

  create(designId: string, templateView?: IView): V;

  render(view: V, refUpdate: (view: IView, ref: Element) => void): JSX.Element | null;

  /**
   * 这个父组件是否可以放置指定类型的子组件, 有些特殊的组件只能放特地类型的子组件需要实现这个方法
   * @param childViewType 要判断的子组件的类型
   * @return 如果可以接收这个子组件, 则返回true
   */
  accept(childViewType: string): boolean;

  /**
   * 如果子组件有些不能被删除的, 则可以实现这个方法来避免
   * @param childViewIndex 子组件的序号, 判断是否不能被删除
   * @return 如果指定序号的子组件不能删除, 则返回true
   */
  preventDeleteChild(childViewIndex: number): boolean;
}
